#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>

static void Usage(const std::string& proc)
{
    std::cout << "\nUsage:" << proc << "pid signo\n" << std::endl;
}

int cnt = 0;

void catchSig(int signo)
{
    std::cout << "获取到一个信号,信号编号是:" << signo << " " << cnt << std::endl;
    // exit(1);
    //alarm(1);
}

//./myprocess pid signo
int main(int argc,char *argv[])
{
    for(int signo = 1; signo <= 31; ++signo)
    {
        signal(signo,catchSig);
    }

    while(true)
    {
        std::cout << "我在运行:" << getpid() << std::endl;
        sleep(1);
    }

    //核心转储
    // while(true){
    //     int a[10];
    //     // a[10000] = 106;
    // }

    //4.软件条件

    //IO慢
    //统计1s左右,我们的计算机能够将数据累计多少次
    // signal(SIGALRM,catchSig);
    // alarm(1);
    // while(true)
    // {
    //     //std::cout << "cnt: " << cnt++ << std::endl;
    //     cnt++;
    // }

    //3.产生信号的方式:硬件异常产生信号
    // signal(11,catchSig);
    // while(true)
    // {    
    //     std::cout << "我在运行中...." << std::endl;
    //     sleep(1);
    //     int *p = nullptr;
    //     //p = nullptr;
    //     //OS怎么知道呢??我野指针了呢?
    //     *p = 100;//为什么 野指针 就会崩溃
    // }

    //信号产生,不一定非得用户显示的发送
    // signal(SIGFPE,catchSig);
    // int a = 10;
    // //收到信号不一定会引起进程退出 -- 没有退出,有可能还会被调用
    // //OS如何得知应该给当前进程发送8号信号的--
    // a /= 0;//SIGFPE

    // while(true)
    // {
    //     std::cout << "我在运行中...." << std::endl;
    //     // int a = 10;
    //     // a /= 0;//SIGFPE
    // }

    //2.系统调用向目标进程发送信号
    //kill()可以向任意进程发送任意信号
    //raise()给自己 发送 任意信号kill(getpid(), 任意信号);
    //abort()给自己 发送 指定信号SIGABRT,  kill(getpid(), SIGABRT);
    // int cnt = 0;
    // while(cnt <= 10)
    // {
    //     printf("cnt: %d,pid:%d\n", cnt++,getpid());
    //     sleep(1);
    //     // if(cnt >= 5)
    //     // {
    //     //     abort();
    //     // }
    //     // if(cnt >= 5)
    //     // {
    //     //     raise(9);
    //     // }
    // }

    // if(argc != 3)
    // {
    //     Usage(argv[0]);
    //     exit(1);
    // }
    // pid_t pid = atoi(argv[1]);
    // int signo = atoi(argv[2]);
    // int n = kill(pid, signo);
    // if(n != 0)
    // {
    //     perror("kill");
    // }

    //1.通过键盘发送信号
    // while(true)
    // {
    //     std::cout << "hello world" << std::endl;
    //     sleep(1);
    // }
}